/* 用串口1输出：hello world */

    .equ STACK_TOP, 0x2000AFFF//SRAM: 0x2000 0000~0x2000 AFFF
    
    .text
    .global Reset_Handler
    .global delay_ms
    .global init_usart0
    .global stop_TX
    .global putc_usart0
    .global deinit_usart0

    .thumb
    .arch armv7-m
    .syntax unified

    .word STACK_TOP, Reset_Handler
    .type Reset_Handler, function

Reset_Handler:
    ldr r0, =$hello_text
    ldr r11, =800000 //使用R11传递延迟时间参数
loop:
    bl delay_ms
    bl init_usart0
    bl puts
    bl stop_TX
    b loop

hello_text:
    .ascii "Hello World!\n"
    .byte 0
    .align //CM3实际支持半字对齐，但是这里不一定是半字的地址，所以要令其对齐

puts:
    /* 该子程序向UART发送字符串 */
    /* 入口条件： r0 = 字符串的起始地址 */
    /* 字符串要以零结尾 */
    push {r0, r1, lr} /* 保存寄存器 */
    mov r1, r0 /* 把地址拷贝到R1，因为 R0 还要用于作putc的参数 */
putsloop:
    ldrb.w r0, [r1], #1 /* 读取一个字符并且自增地址，后缀表示使用32位的thumb2指令 */
    cbz r0, putsloopexit /* 如果字符为NULL，则跳转到结束 */
    bl putc_usart0
    b putsloop
putsloopexit:
    pop {r0, r1, pc} /* 返回 */

    .end
